package com.huangyi.adminservice.house.domain.dto;


import com.huangyi.adminapi.house.domain.dto.DeviceDTO;
import com.huangyi.adminapi.house.domain.dto.TagDTO;
import com.huangyi.adminapi.house.domain.vo.HouseDetailVO;
import lombok.Data;
import org.springframework.beans.BeanUtils;

import java.util.List;

/**
 * 完整的房源信息数据传输对象
 * 
 * <p>整合了房源相关的所有信息，包括：
 * <ul>
 *   <li>房东信息：从AppUser表获取</li>
 *   <li>房源基本信息：从House表获取</li>
 *   <li>位置信息：城市、区域、社区等</li>
 *   <li>设备列表：从字典表获取设备详情</li>
 *   <li>标签列表：从Tag表获取标签信息</li>
 *   <li>状态信息：从House_Status表获取</li>
 * </ul>
 * 
 * @author huangyi
 * @version 1.0
 * @since 2024
 */
@Data
public class HouseDTO {

    /** 房源ID */
    private Long houseId;
    
    // ========== 房东信息（来自AppUser表） ==========
    /** 房东用户ID */
    private Long userId;
    
    /** 房东昵称 */
    private String nickName;
    
    /** 房东头像URL */
    private String avatar;
    
    // ========== 房屋基本信息（来自House表） ==========
    /** 房源标题 */
    private String title;
    
    /** 出租类型（整租/合租等） */
    private String rentType;
    
    /** 所在楼层 */
    private Integer floor;
    
    /** 总楼层数 */
    private Integer allFloor;
    
    /** 房屋类型（住宅/公寓等） */
    private String houseType;
    
    /** 居室数量（几室几厅） */
    private String rooms;
    
    /** 房屋朝向 */
    private String position;
    
    /** 房屋面积（平方米） */
    private Double area;
    
    /** 租金价格（元/月） */
    private Double price;
    
    /** 房源介绍 */
    private String intro;
    
    /** 头图URL */
    private String headImage;
    
    /** 房源图片列表 */
    private List<String> images;

    // ========== 位置信息（来自House表） ==========
    /** 城市ID */
    private Long cityId;
    
    /** 城市名称 */
    private String cityName;
    
    /** 区域ID */
    private Long regionId;
    
    /** 区域名称 */
    private String regionName;
    
    /** 社区名称 */
    private String communityName;
    
    /** 详细地址 */
    private String detailAddress;
    
    /** 经度 */
    private Double longitude;
    
    /** 纬度 */
    private Double latitude;

    // ========== 扩展信息 ==========
    /** 设备列表（从字典表获取设备详情） */
    private List<DeviceDTO> devices;
    
    /** 标签列表（从Tag表获取标签信息） */
    private List<TagDTO> tags;

    // ========== 状态信息（来自House_Status表） ==========
    /** 房源状态（上架/下架/已出租等） */
    private String status;
    
    /** 出租时长代码 */
    private String rentTimeCode;


    /**
     * 计算两地经纬度距离
     * 
     * <p>使用欧几里得距离公式计算两个坐标点之间的距离
     * 
     * @param longitude 目标经度
     * @param latitude 目标纬度
     * @return 两地经纬度距离（单位：度）
     */
    public double calculateDistance(Double longitude, Double latitude) {
        return Math.sqrt(Math.pow(this.longitude - longitude, 2) +
                Math.pow(this.latitude - latitude, 2));
    }

    /**
     * 转换为房源详情视图对象
     * 
     * @return 房源详情视图对象
     */
    public HouseDetailVO convertToVO() {
        HouseDetailVO houseDetailVO = new HouseDetailVO();
        BeanUtils.copyProperties(this, houseDetailVO);
        return houseDetailVO;
    }


}
